package jheej5024;

public class J17_OOP3 {

	//this 연산자, this생성자
    //멤버변수에 사용하는 this는 현재 클래스 자신을 의미
	//생성자에 사용하는 this는 코드 간결성을 위해 사용
	
	public static void main(String[] args) {
		//생성자를 이용해 객체를 만들고
		//멤버변수에 값을 직접 초기화
		
		Member user01 = new Member();
		user01.userid = "zzyzzy";
		user01.passwd = "123456";		

		
		//기본생성자만을 이용해서
		//멤버변수 초기화
		Member user02 = new Member();
		user02.showInfo();
		Member user03 = new Member();
		user03.showInfo();
		
		// 인자있는 생성자로 객체 생성
		Member user04 = new Member("123456","987654");
		user04.showInfo();
		
		
		
		Car mycar01 = new Car();  //기본생성자
		Car mycar02 = new Car("BMW","red"); //인자있는 생성자
		
		
		
	}  //main
	
}  //class


    class Member{
	String userid;
	String passwd;
	
	//기본 생성자 - 인자없음
	public Member(){
		userid = "taehee";
		passwd = "987654";
	}
	
	//사용자 정의 생성자 - 인자있음
	public Member(String myuserid, String mypasswd){
		userid = myuserid;
		passwd = mypasswd;
	}
	
	//회원정보 출력 showInfo
    void showInfo(){
    	System.out.println( userid );
    	System.out.println( passwd );
    }
}  
    class Car{
    	String brand;
    	String color;
    	
    public Car(){ }
    
    //인자 있는 생성자를 사용하는 경우
    //기본 생성자도 직접 만들어 둬야 함
    public Car(String mybrand, String mycolor){
    	brand = mybrand;
    	color = mycolor;		
    }
    	
    }

    
    class DVD {
    	int dvdno;
    	String dvdtitle;
    	String genre;
    	
    public DVD() {}
    public DVD(int dvdno, String dvdtitle, String genre) {
    	//생성자의 인자명과 멤버변수명은 동일하게 작성
    	//왜냐하면, 생성자의 인자명을 새로 짓는것은 귀찮음
    	
    	//그런데, 생성자의 인자명과 멤버변수명이 
    	//서로 같은 경우 멤버변수가리기shadowing 현상이 발생
    	//따라서, 클래스의 멤버변수는 this 연산자를 이용해서 가리기 현상을 방지
    	//dvdno = dvdno;
    	//dvdtitle = dvdtitle;
    	//genre = genre;
    	this.dvdno = dvdno;
    	this.dvdtitle = dvdtitle;
    	this.genre = genre;
    	
    }
    	
    	
    }
    
    
    class Book {
    	int bookno;
    	String booktitle;
    	String genre;
    	
    	public Book() {}
    	public Book(int bookno) {
    	this.bookno = bookno;
    }
    	public Book(String booktitle) {
        this.booktitle = booktitle;
  }
    	public Book(int bookno, String booktitle) {
    		//this.bookno=bookno;
    		//this.booktitle=booktitle;
    	    //Book(bookno);    //첫번째 줄코드를 간단히 쓰기
    	    //Book(booktitle); //두번째 줄코드를 간단히 쓰기
    		this(bookno);      //첫번째 줄 코드를 this()대체
    		//this(booktitle); //두번째 줄 코드를 this()대체
    		//단, this()는 언제나 코드의 맨처음에 나와야 함
    		
    	}
    } 
    	
    	
    	
    	
    	
    	
    	
    	
    	
    	
